package com.example.user.customviewdemo.drawing.paint;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.CornerPathEffect;
import android.graphics.DashPathEffect;
import android.graphics.DiscretePathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathDashPathEffect;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;

/**
 * 厚积方能薄发
 * Created by user on 2016/4/25.
 * paint中所有处理函数的使用方法
 */
public class MyPaintView extends View {

    private Path path = new Path();
    private Paint paint = new Paint();
    private float phase;

    public MyPaintView(Context context) {
        super(context);
    }

    public MyPaintView(Context context, AttributeSet attrs) {
        super(context, attrs);

        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(50);
    }

    public MyPaintView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    /**
     * reset()重置画笔
     * setColor(int color)给画笔设置颜色值
     * setARGB(int a, int r, int g, int b)同样是设置颜色，但是利用ARGB分开设置
     * setAlpha(int a)设置画笔透明度
     * setStyle(Paint.Style style)设置画笔样式，取值有
     * Paint.Style.FILL :填充内部
     * Paint.Style.FILL_AND_STROKE ：填充内部和描边
     * Paint.Style.STROKE ：仅描边
     * setStrokeWidth(float width)设置画笔宽度
     * setAntiAlias(boolean aa)设置画笔是否抗锯齿
     * <p/>
     * 上面这些函数，我们在前面几篇已经详细讲过了，难度也都不大，不再细讲。下面几个函数我们是没有讲到过的，下面做下补充
     * setStrokeCap(Paint.Cap cap)
     * 设置线冒样式，取值有Cap.ROUND(圆形线冒)、Cap.SQUARE(方形线冒)、Paint.Cap.BUTT(无线冒)
     * setStrokeJoin(Paint.Join join)
     * 设置线段连接处样式，取值有：Join.MITER（结合处为锐角）、Join.Round(结合处为圆弧)、Join.BEVEL(结合处为直线)
     * setStrokeMiter(float miter)
     * 设置笔画的倾斜度，90度拿画笔与30拿画笔，画出来的线条样式肯定是不一样的吧。（事实证明，根本看不出来什么区别好吗……囧……）
     * setPathEffect(PathEffect effect)
     * 设置路径样式;取值类型是所有派生自PathEffect的子类：ComposePathEffect, CornerPathEffect, DashPathEffect, DiscretePathEffect, PathDashPathEffect, SumPathEffect
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.BLACK);
        path.reset();


        /*************************设置线帽paint.setStrokeCap()*****************************/
        paint.setStrokeCap(Paint.Cap.BUTT);//无线帽，系统默认无线帽
        canvas.drawLine(100, 100, 900, 100, paint);

        paint.setStrokeCap(Paint.Cap.ROUND);//圆形线帽
        canvas.drawLine(100, 200, 900, 200, paint);

        paint.setStrokeCap(Paint.Cap.SQUARE);//方型线帽
        canvas.drawLine(100, 300, 900, 300, paint);

        /************************设置直线拐角paint.setStokeJoin()************************/
        paint.setStrokeJoin(Paint.Join.ROUND);

        path.moveTo(100, 400);
        path.lineTo(500, 400);
        path.lineTo(100, 500);
        canvas.drawPath(path, paint);

        /***********************设置路径效果paint.setPathEffect()****************************/
        //圆角效果
        paint.setStrokeWidth(5);
        path.reset();
        path.moveTo(100, 600);
        path.lineTo(200, 700);
        path.lineTo(300, 600);
        path.lineTo(400, 700);
        path.lineTo(500, 600);
        path.lineTo(600, 700);
        path.lineTo(700, 600);
        path.lineTo(800, 700);
        path.lineTo(900, 600);
        CornerPathEffect cornerPathEffect = new CornerPathEffect(20);//设置圆形拐角参数指半径为20的圆
        paint.setPathEffect(cornerPathEffect);
        canvas.drawPath(path, paint);

        //虚线效果
        /**
         * public DashPathEffect(float intervals[], float phase)
         * intervals[]：表示组成虚线的各个线段的长度；
         * 整条虚线就是由intervals[]中这些基本线段循环组成的。
         * 比如，我们定义new float[] {20,10}；
         * 那这个虚线段就是由两段线段组成的，第一个可见的线段长为20，每二个线段不可见，长度为10；
         * 对于intervals[]数组的有两个限定：
         长度必须大于等于2；因为必须有一个实线段和一个空线段来组成虚线。
         个数必须为偶数，如果是基数，最后一个数字将被忽略；这个很好理解，
         因为一组虚线的组成必然是一个实线和一个空线成对组成的。
         */
        canvas.translate(0, 100);
        float[] intervals = {50, 20, 10, 20};
        DashPathEffect dashPathEffect = new DashPathEffect(intervals, phase);
        paint.setPathEffect(dashPathEffect);
        canvas.drawPath(path, paint);

        //离散效果
        /**
         * public DiscretePathEffect(float segmentLength, float deviation)
         * 第一个参数segmentLength：表示将原来的路径切成多长的线段。
         *                      如果值为2，那么这个路径就会被切成一段段由长度为2的小线段。
         *                      所以这个值越小，所切成的小线段越多；这个值越大，所切成的小线段越少。
         * 第二参数deviation：表示被切成的每个小线段的可偏移距离。
         *                      值越大，就表示每个线段的可偏移距离就越大，就显得越凌乱，
         *                      值越小，每个线段的可偏移原位置的距离就越小。
         */
        path.reset();
        path.moveTo(100, 600);
        path.lineTo(200, 700);
        path.lineTo(300, 600);
        path.lineTo(400, 700);
        path.lineTo(500, 600);
        path.lineTo(600, 700);
        path.lineTo(700, 600);
        path.lineTo(800, 700);
        path.lineTo(900, 600);
        canvas.translate(0, 100);
        DiscretePathEffect discretePathEffect = new DiscretePathEffect(5, 20);
        paint.setPathEffect(discretePathEffect);
        canvas.drawPath(path, paint);

        //印章路劲效果
        /**
         * public PathDashPathEffect(Path shape, float advance, float phase,Style style)
         *
         * Path shape:表示印章路径，比如我们下面示例中的三角形加右上角一个点；
         * float advance：表示两个印章路径间的距离,很容易理解，印章间距离越大，间距就越大。
         * float phase：路径绘制偏移距离，与上面DashPathEffect中的float phase参数意义相同
         * Style style：表示在遇到转角时，如何操作印章以使转角平滑过渡，取值有：
                                                     Style.ROTATE，Style.MORPH，Style.TRANSLATE;
                                                     Style.ROTATE表示通过旋转印章来过渡转角；
                                                     Style.MORPH表示通过变形印章来过渡转角；
                                                     Style.TRANSLATE表示通过位移来过渡转角。
         * 这三个效果的具体意义，上面会通过具体示例来分别讲解。
         */
        Path shape = new Path();
        shape.addCircle(0,0,20, Path.Direction.CW);
        path.reset();
        path.moveTo(100,1200);
        path.lineTo(500,800);
        path.lineTo(900,1200);
        PathDashPathEffect pathDashPathEffect = new PathDashPathEffect(shape,50,phase, PathDashPathEffect.Style.ROTATE);
        Paint paint = new Paint();
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(1);
        paint.setStyle(Paint.Style.STROKE);
        paint.setPathEffect(pathDashPathEffect);
        canvas.drawPath(path,paint);

        /*********************合并效果ComposePathEffect与SumPathEffect *******************************/
        /**
         * 使用来合并效果的，比如一个PathDashPathEffect一个DiscretePathEffect
         * 然后使用ComposePathEffect就可以对他们进行合并
         *
         * public ComposePathEffect(PathEffect outerpe, PathEffect innerpe)
         * ComposePathEffect合并两个特效是有先后顺序的，它会先将第二个参数的PathEffect innerpe的特效作用于路径上，
         * 然后再在此加了特效的路径上作用第二个特效。
         *
         * public SumPathEffect(PathEffect first, PathEffect second)
         * ComposePathEffect合并两个特效是有先后顺序的，它会先将第二个参数的PathEffect innerpe的特效作用于路径上，
         * 然后再在此加了特效的路径上作用第二个特效。
         */



    }

    public void startAnimator() {
        final ValueAnimator animator = ValueAnimator.ofFloat(0, 100);
        animator.setInterpolator(new LinearInterpolator());
        animator.setDuration(2000);
        animator.setRepeatCount(100);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                phase = (float) animator.getAnimatedValue();
                postInvalidate();
            }
        });
        animator.start();
    }
}
